package com.xspace.android.xafcommon.base;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

/**
 * Wubj 创建于 2016/9/25.
 */
public abstract class BasicAdapter<T> extends BaseAdapter {

    /**
     * 传入要填充的数据,子类可以直接使用
     */
    protected List<T> mDataList;
    protected Context mContext;

    /**
     * 构造方法中传入要填充的数据
     *
     * @param mContext
     * @param mDataList 要填充的数据
     */
    public BasicAdapter(Context mContext, List<T> mDataList) {
        this.mContext = mContext;
        this.mDataList = mDataList;
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public T getItem(int position) {
        return mDataList.get(position);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        BaseHolder<T> holder;
        if (convertView == null) {
            /**
             * 当convertView为null时,创建ViewHolder,因为要填充的数据不同,所以抽取一个抽象方法,交由子类实现
             * position在使用多类型的ListView中会用到,所以这里传入之后提高扩展性
             */
            holder = getHolder();
            //在holder中创建一个方法,返回器中的holderView,用作这里的convertView
            convertView = holder.getHolderView();
        } else {
            holder = (BaseHolder<T>) convertView.getTag();
        }
        /**
         * 处理数据的逻辑也不相同.由holder的子类重写方法来处理,我们只需要传入需要处理的数据即可
         */
        holder.bindData(mDataList.get(position), position);
        /**
         * 增加炫酷动画,直接在这里设置即可
         */
        setAnim(convertView);
        return convertView;
    }

    /**
     * 设置convertView的显示动画,子类可以重写来更改动画
     *
     * @param convertView ListView中的条目
     */
    protected void setAnim(View convertView) {
    }

    /**
     * 子类必须重写的方法,根据需要来返回需要的ViewHolder
     *
     * @return BaseHolder的子类实现
     */
    public abstract BaseHolder<T> getHolder();

}
